package com.cje.pojo;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * @Auther: ChenJinEn
 * @Date: 2020/4/17 07:58
 * @Description: //TODO
 *
 *
 */
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class Item {

    public Item() {
    }

    public Item(Long id, String title, String category, String brand, Double price, String images) {
        this.id = id;
        this.title = title;
        this.category = category;
        this.brand = brand;
        this.price = price;
        this.images = images;
    }
    /**
     - 类型名称：就是前面将的type的概念，类似于数据库中的不同表
     字段名：任意填写	，可以指定许多属性，例如：
     - type：类型，可以是text、long、short、date、integer、object等
     - index：是否索引，默认为true
     - store：是否存储，默认为false
     - analyzer：分词器，这里的ik_max_word即使用ik分词器
     字段属性详解
     我们说几个关键的：

     - String类型，又分两种：
     - text：可分词，不可参与聚合
     - keyword：不可分词，数据会作为完整字段进行匹配，可以参与聚合
     - Numerical：数值类型，分两类
     - 基本数据类型：long、interger、short、byte、double、float、half_float
     - 浮点数的高精度类型：scaled_float
     - 需要指定一个精度因子，比如10或100。elasticsearch会把真实值乘以这个因子后存储，取出时再还原。
     - Date：日期类型
     elasticsearch可以对日期格式化为字符串存储，但是建议我们存储为毫秒值，存储为long，节省空间。

     index影响字段的索引情况。
     - true：字段会被索引，则可以用来进行搜索。默认值就是true
     - false：字段不会被索引，不能用来搜索
     index的默认值就是true，也就是说你不进行任何配置，所有字段都会被索引。
     但是有些字段是我们不希望被索引的，比如商品的图片信息，就需要手动设置index为false。

     store
     是否将数据进行额外存储。
     在学习lucene和solr时，我们知道如果一个字段的store设置为false，那么在文档列表中就不会有这个字段的值，用户的搜索结果中不会显示出来。
     但是在Elasticsearch中，即便store设置为false，也可以搜索到结果。
     原因是Elasticsearch在创建文档索引时，会将文档中的原始数据备份，保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示，哪些不显示。
     而如果设置store为true，就会在_source以外额外存储一份数据，多余，因此一般我们都会将store设置为false，事实上，store的默认值就是false。

     boost
     激励因子，这个与lucene中一样
     其它的不再一一讲解，用的不多，大家参考官方文档：
     */

    @Id
    private Long id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title; //标题

    @Field(type = FieldType.Keyword)
    private String category;// 分类

    @Field(type = FieldType.Keyword)
    private String brand; // 品牌

    @Field(type = FieldType.Double)
    private Double price; // 价格

    @Field(index = false, type = FieldType.Keyword)
    private String images; // 图片地址

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getImages() {
        return images;
    }

    public void setImages(String images) {
        this.images = images;
    }

    @Override
    public String toString() {
        return "Item{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", category='" + category + '\'' +
                ", brand='" + brand + '\'' +
                ", price=" + price +
                ", images='" + images + '\'' +
                '}';
    }
}
